package fr.auzaiphe.admin.bdd;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import fr.auzaiphe.admin.model.Indice;
import fr.auzaiphe.admin.model.Jeu;
import fr.auzaiphe.admin.model.Joueur;

public class ChargementHandler
{

	private BaseDeDonnee bdd;
	private Jeu jeu;

	public ChargementHandler(BaseDeDonnee pBdd, Jeu pJeu)
	{
		this.bdd = pBdd;
		this.jeu = pJeu;

		try
		{
			this.remplirListJoueur();
			this.remplirListAlerte(this.jeu.getListeJoueurs());
			this.remplirListIndice(this.jeu.getListeJoueurs());
			//this.liaisonJoueurIndice(this.jeu.getListeIndices(),this.jeu.getListeJoueurs());
			this.remplirScenario();
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
	}

	public void remplirListJoueur() throws SQLException
	{
		String requete = "SELECT * FROM JOUEUR;";

		ResultSet resultat;
		resultat = this.bdd.executerRequete(requete);

		while( resultat.next() )
		{
			this.jeu.addJoueur
			(
				resultat.getInt("JOUEUR_ID"),
				resultat.getString("JOUEUR_NOM_PERSONNAGE"),
				resultat.getString("JOUEUR_PRENOM_PERSONNAGE"),
				resultat.getString("JOUEUR_BACKGROUND"),
				resultat.getString("JOUEUR_MOT_DE_PASSE"),
				resultat.getInt("JOUEUR_TEMPS_RESTANT")
			);
		}
	}


	public void remplirListAlerte(ArrayList<Joueur> listeJoueurs ) throws SQLException
	{
		String requete = "SELECT * FROM ALERTE;";

		ResultSet resultat;
		resultat = this.bdd.executerRequete(requete);

		Joueur joueur = null;
		Joueur joueurChrono = null;

		while( resultat.next()){

			for(int i = 0; i < listeJoueurs.size(); i++)
	        {
				if (listeJoueurs.get(i).getId()==resultat.getInt("JOUEUR_ID"))
					joueur=listeJoueurs.get(i);
				if (listeJoueurs.get(i).getId()==resultat.getInt("ACTIVATION"))
					joueurChrono=listeJoueurs.get(i);
	        }

			/*
			System.out.println(resultat.getString("ALERTE_ID"));
			System.out.println(resultat.getString("JOUEUR_ID"));
			System.out.println(resultat.getString("CIBLE_ALL"));
			System.out.println(resultat.getString("CIBLE_ADMIN"));
			System.out.println(resultat.getString("ALERTE_HEURE_AFFICHE"));
			System.out.println(resultat.getString("ACTIVATION"));
			System.out.println(resultat.getString("ALERTE_TITRE"));
			System.out.println(resultat.getString("ALERTE_TEXTE"));
			System.out.println(resultat.getString("ALERTE_LIEN_FICHIER"));
			System.out.println(joueur.getId());
			//*/
			//System.out.println("JoueurId : "+joueur.getId());
			this.jeu.addAlerte
			(
				resultat.getInt("ALERTE_ID"),
				((resultat.getInt("CIBLE_ALL")==1)? true : false ),
				((resultat.getInt("CIBLE_ADMIN")==1)? true : false ),
				joueur,

				((joueurChrono == null)? this.jeu.getChrono() : joueurChrono.getChrono()) ,

				resultat.getInt("ALERTE_HEURE_AFFICHE"),
				resultat.getString("ALERTE_TITRE"),
				resultat.getString("ALERTE_TEXTE"),
				resultat.getString("ALERTE_LIEN_FICHIER")
			);
		}
	}

	public void remplirListIndice(ArrayList<Joueur> listeJoueurs) throws SQLException
	{

		String requeteIndice = "SELECT * FROM INDICE;";

		ResultSet resultatIndice;
		resultatIndice = this.bdd.executerRequete(requeteIndice);

		while( resultatIndice.next())
		{
			ArrayList<Joueur> pLies = new ArrayList<Joueur>();
			ArrayList<Joueur> pVisibles = new ArrayList<Joueur>();

			String requeteEstAssocieA = "SELECT INDICE.INDICE_ID, INDICE.INDICE_TEXTE, INDICE.INDICE_LIEN_FICHIER, " +
			"INDICE.INDICE_DEBUT_VIE, INDICE.INDICE_FIN_VIE, INDICE.EVT_INDICE_ON, " +
			"INDICE.EVT_INDICE_OFF,EST_ASSOCIE_A.INDICE_ID, EST_ASSOCIE_A.JOUEUR_ID " +
			"FROM INDICE " +
			"LEFT JOIN EST_ASSOCIE_A " +
			"ON INDICE.INDICE_ID = EST_ASSOCIE_A.INDICE_ID " +
			"WHERE INDICE.INDICE_ID = '"+ resultatIndice.getInt("INDICE_ID")+"'; ";

			ResultSet resultatEstAssocieA = this.bdd.executerRequete(requeteEstAssocieA);

			while( resultatEstAssocieA.next() )
			{
				for(int i = 0; i < listeJoueurs.size(); i++)
		        {
					if (listeJoueurs.get(i).getId() == resultatEstAssocieA.getInt("EST_ASSOCIE_A.JOUEUR_ID"))
					{
						pLies.add(listeJoueurs.get(i));
					}
		        }
			}

			String requeteEstVisiblePour = "SELECT INDICE.INDICE_ID, INDICE.INDICE_TEXTE, INDICE.INDICE_LIEN_FICHIER, " +
					"INDICE.INDICE_DEBUT_VIE, INDICE.INDICE_FIN_VIE, INDICE.EVT_INDICE_ON, " +
					"INDICE.EVT_INDICE_OFF,EST_VISIBLE_POUR.INDICE_ID, EST_VISIBLE_POUR.JOUEUR_ID " +
					"FROM INDICE " +
					"LEFT JOIN EST_VISIBLE_POUR " +
					"ON INDICE.INDICE_ID = EST_VISIBLE_POUR.INDICE_ID " +
					"WHERE INDICE.INDICE_ID = '"+ resultatIndice.getInt("INDICE_ID")+"'; ";

			ResultSet resultatEstVisiblePour = this.bdd.executerRequete(requeteEstVisiblePour);

			while( resultatEstVisiblePour.next() )
			{
				for(int i = 0; i < listeJoueurs.size(); i++)
		        {
					if ( listeJoueurs.get(i).getId() == resultatEstVisiblePour.getInt("EST_VISIBLE_POUR.JOUEUR_ID"))
					{
						pVisibles.add(listeJoueurs.get(i));
					}
		        }
			}

			this.jeu.addIndice
			(
				pVisibles,
				pLies,
				resultatIndice.getInt("INDICE_ID"),
				resultatIndice.getString("INDICE_TEXTE"),
				resultatIndice.getString("INDICE_LIEN_FICHIER"),
				resultatIndice.getString("INDICE_TITRE"),
				resultatIndice.getInt("INDICE_DEBUT_VIE"),
				resultatIndice.getInt("INDICE_FIN_VIE"),
				resultatIndice.getInt("EVT_INDICE_ON"),
				resultatIndice.getInt("EVT_INDICE_OFF")
			);
		}

	}

	public void liaisonJoueurIndice(ArrayList<Indice> listeIndice, ArrayList<Joueur> listeJoueurs) throws SQLException
	{
		for( int i = 0; i < listeIndice.size(); i++ )
		{
			String requeteEstVisiblePour = "SELECT INDICE_ID, JOUEUR_ID " +
			"FROM EST_VISIBLE_POUR " +
			"WHERE INDICE_ID = '"+ listeIndice.get(i).getId()+"'; ";

			ResultSet resultIndiceVisible = this.bdd.executerRequete(requeteEstVisiblePour);

			while( resultIndiceVisible.next() )
			{
				for ( int j = 0; j < listeJoueurs.size(); j++ )
				{
					if ( listeJoueurs.get(j).getId() == resultIndiceVisible.getInt("JOUEUR_ID"))
					{
						//listeJoueurs.get(j).getIndicesDispo().add( listeIndice.get(i) );
						//listeIndice.get(i).getJoueursVisibles().add(listeJoueurs.get(j));
					}
				}
			}
		}
	}


	public void remplirScenario() throws SQLException
	{

		String requete= "SELECT SCENARIO_ID, SCENARIO_CHRONO, SCENARIO_TEXTE " +
		"FROM SCENARIO " +
		"WHERE SCENARIO_ID = '1'; ";

		ResultSet resultat= this.bdd.executerRequete(requete);
		//ResultSet resultatEstVisiblePour = this.bdd.executerRequete(requeteEstVisiblePour);

		while( resultat.next()){
			this.jeu.setTexte(resultat.getString("SCENARIO_TEXTE"));
			this.jeu.getChrono().setTempsRestant( resultat.getInt("SCENARIO_CHRONO"));
		}


	}
/*
	public void chargementHistorique()
	{

	}
*/

}
